#include <gflags/gflags.h>

#include <iostream>
#include <memory>

#include "data_redis.h"
#include "log.h"

DEFINE_string(ip, "127.0.0.1", "这是服务器的IP地址，格式：127.0.0.1");
DEFINE_int32(port, 6379, "这是服务器的端口, 格式: 8080");
DEFINE_int32(db, 0, "库的编号: 默认0号");
DEFINE_bool(keep_alive, true, "是否进行长连接保活");

DEFINE_int32(level, 1, "日志等级");
DEFINE_bool(enable_debug, false, "调试模式");
DEFINE_string(path, "", "发布模式下, 日志输出到的文件路径");

void test_session(std::shared_ptr<sw::redis::Redis>& client) {
    chat::Session session(client);

    session.append("SessionID-1", "uid1");
    session.append("SessionID-2", "uid2");
    session.append("SessionID-3", "uid3");

    {
        auto uid1 = session.uid("SessionID-1");
        auto uid2 = session.uid("SessionID-2");
        auto uid3 = session.uid("SessionID-3");
        if (uid1) {
            std::cout << *uid1 << std::endl;
        }
        if (uid2) {
            std::cout << *uid2 << std::endl;
        }
        if (uid3) {
            std::cout << *uid3 << std::endl;
        }
    }

    session.remove("SessionID-2");

    {
        auto uid1 = session.uid("SessionID-1");
        auto uid2 = session.uid("SessionID-2");
        auto uid3 = session.uid("SessionID-3");
        if (uid1) {
            std::cout << *uid1 << std::endl;
        }
        if (uid2) {
            std::cout << *uid2 << std::endl;
        }
        if (uid3) {
            std::cout << *uid3 << std::endl;
        }
    }
}
void test_status(std::shared_ptr<sw::redis::Redis>& client) {
    chat::Status status(client);

    status.append("uid1");
    status.append("uid2");
    status.append("uid3");

    {
        if (status.exists("uid1")) {
            std::cout << "uid1" << std::endl;
        }
        if (status.exists("uid2")) {
            std::cout << "uid2" << std::endl;
        }
        if (status.exists("uid3")) {
            std::cout << "uid3" << std::endl;
        }
    }

    status.remove("uid2");

    {
        if (status.exists("uid1")) {
            std::cout << "uid1" << std::endl;
        }
        if (status.exists("uid2")) {
            std::cout << "uid2" << std::endl;
        }
        if (status.exists("uid3")) {
            std::cout << "uid3" << std::endl;
        }
    }
}
void test_code(std::shared_ptr<sw::redis::Redis>& client) {
    chat::Codes codes(client);

    codes.append("code-1", "123", std::chrono::milliseconds(3000));
    codes.append("code-2", "456", std::chrono::milliseconds(3000));
    codes.append("code-3", "789", std::chrono::milliseconds(3000));

    {
        auto code1 = codes.code("code-1");
        auto code2 = codes.code("code-2");
        auto code3 = codes.code("code-3");
        if (code1) {
            std::cout << *code1 << std::endl;
        }
        if (code2) {
            std::cout << *code2 << std::endl;
        }
        if (code3) {
            std::cout << *code3 << std::endl;
        }
    }

    codes.remove("code-2");

    {
        auto code1 = codes.code("code-1");
        auto code2 = codes.code("code-2");
        auto code3 = codes.code("code-3");
        if (code1) {
            std::cout << *code1 << std::endl;
        }
        if (code2) {
            std::cout << *code2 << std::endl;
        }
        if (code3) {
            std::cout << *code3 << std::endl;
        }
    }

    std::this_thread::sleep_for(std::chrono::seconds(4));

    {
        auto code1 = codes.code("code-1");
        auto code2 = codes.code("code-2");
        auto code3 = codes.code("code-3");
        if (!code1) {
            std::cout << "code1 null" << std::endl;
        }
        if (!code2) {
            std::cout << "code2 null" << std::endl;
        }
        if (!code3) {
            std::cout << "code3 null" << std::endl;
        }
    }
}

int main(int argc, char* argv[]) {
    google::ParseCommandLineFlags(&argc, &argv, true);  // 初始化全局参数
    chat::initLogger(FLAGS_level, FLAGS_enable_debug,
                     FLAGS_path);  // 初始化日志

    std::shared_ptr<sw::redis::Redis> client = chat::RedisClientFactory::create(
        FLAGS_ip, FLAGS_port, FLAGS_db, FLAGS_keep_alive);

    test_session(client);
    std::cout << "--------------" << std::endl;
    test_status(client);
    std::cout << "--------------" << std::endl;
    test_code(client);

    return 0;
}